package kr.pe.johnkim.sendme.activity;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import kr.pe.johnkim.sendme.provider.SendMeBlock;
import kr.pe.johnkim.sendme.provider.SendMeFile;
import kr.pe.johnkim.sendme.provider.SendMeLog;
import kr.pe.johnkim.sendme.provider.SendMeRecognition;
import kr.pe.johnkim.sendme.provider.SendMeVoice;
import kr.pe.johnkim.sendme.rest.SendMeAudioMessageRest;
import kr.pe.johnkim.sendme.rest.SendMeBlockRest;
import kr.pe.johnkim.sendme.rest.SendMeLogRest;
import kr.pe.johnkim.sendme.rest.SendMeRecognitionRest;
import kr.pe.johnkim.sendme.util.SendMeActivityManager;
import kr.pe.johnkim.sendme.util.SendMeCommon;
import kr.pe.johnkim.sendme.util.SendMeConstant;
import kr.pe.johnkim.sendme.util.SendMeCustomTimePickerDialog;
import kr.pe.johnkim.sendme.util.SendMeDBManagerAudioRecord;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

/**
 * 임시 보관 메시지를 재생할때 사용되는 액티비티 클래스이다.
 *  녹음 화면에서 녹음 이후 재생할때 처럼 기본적인 재생 기능이 있고
 *  하단 버튼들은 녹음화면에서의 기능과 다르므로 새롭게 구현되어 있다.
 *  
 *  하단 버튼 목록
 *   재생 : 음성 메시지 재생			: 파일 절대 경로 필요 filePath
 *   전송 : 음성 메시지 전송  (성공시 이후 삭제 처리)		: sender, receiver, fileName,  
 *   예약 : 음성 메시지 예약 전송  (성공시 이후 삭제 처리)  : sender, receiver, fileName, 
 *   삭제 : 음성 메시지 삭제 (sqlite 에서도 삭제하고, 로컬 파일도 함께 삭제). 삭제 후 화면을 닫고 임시 보관함으로 이동..	: id, filePath, 
 * @author blue
 *
 */
public class SendMeAudioPlayForReservationMessageActivity extends Activity implements OnClickListener, OnCompletionListener{

	public static String TAG = SendMeAudioPlayForReservationMessageActivity.class.getSimpleName();
	
	// 액티비티 매니저를 가져 온다.
	private SendMeActivityManager sendMeActivityManager = SendMeActivityManager.getInstance();

//	String applicationAudioTempDirectory = SendMeConstant.APPLICATION_AUDIO_TEMP_DIRECTORY; 		//"/Android/data/kr.pe.jonhkim.sendme.activity/.AudioRecord/temp";			// 녹음 중인 임시파일 저장될 경로 지정, 탐색기,미디어 스캐너에 나타나지 않게 비공개 처리 

	// 녹음 음성 재생기
	private MediaPlayer mPlayer = null;

	// 파일명
	String fileName;

	// 파일명 포함하는 파일 경로			// 다운 받은 파일이 임시 저장될 경로. 다운받을때 새로 생성해주어야 하며 따로 저장해 두어야 함. ###  
	String filePath;
	
	// 보내는 사람 전번		
	String sender;
	
	// 전달받은 키 값
	String receiveIdSendMeVoice;
	// 전달 받은 받는 사람 전번 등 정보
	String receiveReceiver ;
	String receiveReceiverName;
	String receiveFileName;		
	String receiveIdSendMeFile;		
	// 읽음 여부. 읽지 않은 경우에만 업데이트 하기 위함.
	String receiveReadYn;
//	
//	String sqliteKey;
//	String receiver;
//	String receiverName;
	
	// 보낸 사람 표시 뷰
	TextView audioRecordSenderNameTxt;

	// 녹음 시간
	private int mProgressCheckStepMs = SendMeConstant.mProgressCheckStepMs;		// 녹음 및 재생에서 진행바의 갱신 간격(ms 단위) : 0.5초마다 체크
	
	// 재생 중 표시
	SeekBar playSeekbar;		// 재생 진행 상태 바
	TextView mTvPlayMaxPoint;	// 전체 재생 시간

	// 하단 녹음 이후 메뉴 버튼들
	ImageButton menuPlayBtn;	  
	ImageButton menuSendBtn;
	ImageButton menuDeleteBtn;	  

	// 상단 재생 관련 스크린 레이아웃
	View audioPlayScreenLayout;
	// 하단 녹음 이후 메뉴 레이아웃
	View bottomRecordMenuLayout;

	ImageButton imageButtonTopBack;
	ImageButton imageButtonTopMainMenu;
	
	// 프로그래스바(로딩 표시)
	private ProgressDialog dialog;
	
	
	// 로그를 남긴다
	private static final int THREAD_REGISTER_LOG = 100;
	
	// 메시지 파일을 서버로부터 받는다.
	private static final int THREAD_DOWNLOAD_AUDIO_FILE = 104;
	
	// 녹음 재생 준비
	private static final int THREAD_INIT_PLAYING = 115;
	
	// 녹음을 재생한다
	private static final int THREAD_PLAYING_RECORD = 105;
	
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 108;

	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 109;

	// 음성 메시지 전송전 확인 창을 띄운다				
	private static final int THREAD_CONFIRM_SEND_AUDIO = 106;	
	
	// 등록 성공 토스트를 띄운다
	private static final int THREAD_TOAST_SEND_SUCCESS = 110;

	// 등록 실패 토스트를 띄운다
	private static final int THREAD_TOAST_SEND_FAIL = 112;		

	
	
	// 받은 저장 음성 메시지를 서버에서 삭제할지 확인받는다
	private static final int CONFIRM_DELETE_RESERVATION_AUDIO_FILE = 123;		
	
	// 받은 저장 음성 메시지를 서버에서 삭제 한다
	private static final int THREAD_DELETE_RESERVATION_AUDIO_FILE = 124;			
	
	// 삭제 성공 토스트를 띄운다
	private static final int THREAD_TOAST_DELETE_SUCCESS = 116;	
	
	// 삭제 실패 토스트를 띄운다
	private static final int THREAD_TOAST_DELETE_FAIL = 118;		
	
	// 재생시 SeekBar 처리
	Handler mProgressHandler2 = new Handler()
	{
		public void handleMessage(Message msg)
		{
			if (mPlayer == null) return;
			try
			{
				if (mPlayer.isPlaying())
				{
					if(mPlayer.getCurrentPosition()>0){		// 재생 끝나고나서도 동작되어 0이 표시되는 경우가 있기 때문에 0은 표시해주지 않도록 처리
						playSeekbar.setProgress(mPlayer.getCurrentPosition());
					}
					mProgressHandler2.sendEmptyMessageDelayed(0, mProgressCheckStepMs);
				}
			}
			catch (IllegalStateException e)
			{}
			catch (Exception e)
			{}
		}
	};

	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// 커스텀 타이블 바를 설정 한다.
		Window window = getWindow();
		window.requestFeature(Window.FEATURE_CUSTOM_TITLE);

		setContentView(R.layout.activity_send_me_play_for_reservation_message);

		window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_03);

		// 액티비티 매니저에 담는다.
		sendMeActivityManager.addActivity(this);

		// 내 전화번호 (보낸 사람 전화번호) 획득
		confirmNotification();

		
		// 뒤로 가기 화살표 버튼을 설정 한다.
		imageButtonTopBack = (ImageButton)findViewById(R.id.imageButtonTopBack);
		imageButtonTopBack.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub

				Intent intent = new Intent(returnThis(), SendMeReservationMessageListActivity.class);
				startActivity(intent);
				
				// 화면을 닫는다.
				deleteFileAndFinishActivity();
			}
		});

		// 타이틀바의 메인 메뉴 버튼을 설정 한다.
		imageButtonTopMainMenu = (ImageButton)findViewById(R.id.imageButtonTopMainMenu);
		imageButtonTopMainMenu.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "pressed top main menu.");

				// 메인 메뉴 화면을 출력 한다.
				Intent i = new Intent(SendMeAudioPlayForReservationMessageActivity.this, SendMeMainMenuActivity.class);
				startActivity(i);
				
				// 화면을 닫는다.
				deleteFileAndFinishActivity();
			}
		});
		
		
		// 전달받은 받는 사람(리스트) 를 획득						
		Intent getIntent = getIntent();
		
		receiveIdSendMeVoice = getIntent.getStringExtra("idSendMeVoice");
		receiveReceiver = getIntent.getStringExtra("receiver");
		receiveReceiverName = getIntent.getStringExtra("receiverName");
		receiveFileName = getIntent.getStringExtra("fileName");
		receiveIdSendMeFile = getIntent.getStringExtra("idSendMeFile");
//		receiveReadYn = getIntent.getStringExtra("readYn");		
//		
//		// 답장을 보낼땐 전달받은 보낸 사람 전화번호가 받을 사람 전화번호가 된다.
//		SendMeCommon sendMeCommon = new SendMeCommon();
//		receiverList = sendMeCommon.convertStringToArray(receiveSender);
//		receiverNameList = sendMeCommon.convertStringToArray(receiveSenderName);
		
		// 상단 재생 관련 스크린 레이아웃
		audioPlayScreenLayout = (View) findViewById(R.id.audio_play_screen_layout);					// 녹음 후
		// 하단 버튼 레이아웃들
		bottomRecordMenuLayout = (View) findViewById(R.id.audio_record_bottom_menu_layout);					// 녹음 후

		/*
		 * 재생 진행바
		 */
		mTvPlayMaxPoint = (TextView) findViewById(R.id.tvPlayMaxPoint);		// 시간 표시
		playSeekbar = (SeekBar) findViewById(R.id.play_seekbar);
		playSeekbar.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {
			playSeekbarChange(v);
			return false; }
		});

		// 메뉴 버튼들
		menuPlayBtn = (ImageButton) findViewById(R.id.menu_play_btn);
		menuPlayBtn.setOnClickListener(this);
		
		menuSendBtn = (ImageButton) findViewById(R.id.menu_send_btn);
		menuSendBtn.setOnClickListener(this);
		
		menuDeleteBtn = (ImageButton) findViewById(R.id.menu_delete_btn);	 
		menuDeleteBtn.setOnClickListener(this);

		// 보낸 사람 이름 표시 뷰(재생용)
		audioRecordSenderNameTxt = (TextView) findViewById(R.id.audioRecordSenderNameTxt);
		
		// 이름 있으면 이름으로 표시, 없으면 전번으로 표시
		if(receiveReceiverName!=null && receiveReceiverName.length()>0){
			audioRecordSenderNameTxt.setText(receiveReceiverName);	// receiverList --> receiverNameList
		}else{
			audioRecordSenderNameTxt.setText(receiveReceiver);
		}
		
		
		// 로깅.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_LOG));
			
		
		// 음성 메시지 파일 다운로드 
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_DOWNLOAD_AUDIO_FILE));
	}

	/*
	 * 하단 메뉴 버튼 클릭 리스너
	 */
	@Override
	public void onClick(View v) {
		switch (v.getId()) {

			// 재생
		case R.id.menu_play_btn:
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PLAYING_RECORD));
			break;
			
			// 전송
		case R.id.menu_send_btn:
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CONFIRM_SEND_AUDIO));
			break;
			
			// 삭제
		case R.id.menu_delete_btn:
			// 삭제 확인, 삭제 후 닫기
			mHandler.sendMessage(mHandler.obtainMessage(CONFIRM_DELETE_RESERVATION_AUDIO_FILE));
			break;
		}
	}

	
	
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 확인창.
	
	/**
	 * 음성 메시지 전송 전 확인 창을 띄운다
	 * 
	 */
	private Runnable confirmSendReservationMessage = new Runnable() {
		@Override
		public void run() {

			new AlertDialog.Builder(SendMeAudioPlayForReservationMessageActivity.this)
			.setTitle("전송 확인")
			.setMessage("음성 메시지를 전송하시겠습니까?")
			.setNegativeButton("취소", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {

				}
			})
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {
					threadUpdateDeliveryYn();
				}
			}).show();

		}
	};
	
	/**
	 * 음성 메시지 삭제 전 확인 창을 띄운다
	 * 
	 */
	private Runnable confirmDeleteReservationAudio = new Runnable() {
		@Override
		public void run() {
			
			new AlertDialog.Builder(SendMeAudioPlayForReservationMessageActivity.this)
			.setTitle("삭제 확인")
			.setMessage("음성 메시지를 삭제하시겠습니까?")
			.setNegativeButton("취소", new DialogInterface.OnClickListener() {

				@Override
				public void onClick(DialogInterface dialog, int which) {

				}
			})
			.setPositiveButton("확인", new DialogInterface.OnClickListener() {
				
				@Override
				public void onClick(DialogInterface dialog, int which) {
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_DELETE_RESERVATION_AUDIO_FILE));
				}
			}).show();
			
		}
	};


	
	// 토스트
	/**
	 * 음성 메시지 전송에 성공했다는 toast 를 띄운다.
	 */
	public void showToastAudioSendSuccess() {					
		CharSequence text = "메시지가 전송 되었습니다";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	/**
	 * 음성 메시지 전송에 실패했다는 toast 를 띄운다.
	 */
	public void showToastAudioSendFail() {
		CharSequence text = "메시지 전송에 실패하였습니다";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 *  음성 메시지 삭제에 성공했다는 toast 를 띄운다.		
	 */
	public void showToastAudioDeleteToSuccess() {
		CharSequence text = "삭제되었습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
		
		// 화면을 닫는다.
//		sendMeActivityManager.removeActivity(SendMeAudioPlayForReservationMessageActivity.this);
//		finish();
		mediaPlayerReleaseAndFinishThisActivity();
	}
	/**
	 * 음성 메시지 삭제에 실패했다는 toast 를 띄운다.
	 */
	public void showToastAudioDeleteToFail() {
		CharSequence text = "삭제에 실패하였습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	


	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//  

	/**
	 * 필요한 핸들러를 등록해서 사용한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			
			// 로그를 남긴다
			case THREAD_REGISTER_LOG : 
				threadRegisterLog();
				break;
			// 서버에서 음성 메시지 파일을 다운받는다
			case THREAD_DOWNLOAD_AUDIO_FILE : 
				threadDonwoloadAudioMessage();
				break;
				
				// 녹음한 음성을 재생한다
			case THREAD_INIT_PLAYING : 
				runOnUiThread(initToPlay);
				break;
				// 녹음한 음성을 재생한다
			case THREAD_PLAYING_RECORD : 
				runOnUiThread(playRecording);
				break;
				
				 
				// (서버 통신) 전송 확인 창을 띄운다
			case THREAD_CONFIRM_SEND_AUDIO : 
				runOnUiThread(confirmSendReservationMessage);
				break;
				
				// (서버 통신) 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
						dialog.show();
				break;
				// (서버 통신) 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				dialog.hide();
				break;
				// (서버 통신) 전송 성공 토스트를 띄운다	
			case THREAD_TOAST_SEND_SUCCESS : 
				showToastAudioSendSuccess();		
				break;	
				// (서버 통신) 전송 실패 토스트를 띄운다
			case THREAD_TOAST_SEND_FAIL :
				showToastAudioSendFail();
				break;	
				
				// 음성 메시지 삭제 확인받는다  -> 확인 누르면 삭제 후 종료
			case CONFIRM_DELETE_RESERVATION_AUDIO_FILE :
				runOnUiThread(confirmDeleteReservationAudio);		
				break;	
				
				// 예약 음성 메시지를 서버에서 삭제 한다		
			case THREAD_DELETE_RESERVATION_AUDIO_FILE :
				threadDeleteAudioMessage();	
				break;	
				// 음성 메시지 삭제 성공 토스트를 띄운다			showToastAudioDeleteToSuccess	showToastAudioDeleteToFail
			case THREAD_TOAST_DELETE_SUCCESS :
				showToastAudioDeleteToSuccess();
				break;	
				// 음성 메시지 삭제 실패 토스트를 띄운다
			case THREAD_TOAST_DELETE_FAIL :
				showToastAudioDeleteToFail();
				break;	
				
			}
		}
	};
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 재생 관련 기능들

	/**
	 * 음성 재생 준비
	 */
	private Runnable initToPlay = new Runnable() {
		@Override
		public void run() {
			if(filePath.length()>0){
				initMediaPlayer();
			}
		}
	};
	/**
	 * 녹음한 음성을 재생한다
	 */
	private Runnable playRecording = new Runnable() {
		@Override
		public void run() {
			if(filePath.length()>0){
				// 음성을 재생한다
				startPlay();
			}
		}
	};

	/*
	 * 진행바를 터치하여 미디어 플레이어를 컨트롤할수 있도록한다
	 */
	private void playSeekbarChange(View v){
		if(mPlayer.isPlaying()){
			SeekBar sb = (SeekBar)v;
			mPlayer.seekTo(sb.getProgress());
		}
	}

	/*
	 * 미디어 플레이어 초기화
	 */
	private void initMediaPlayer()
	{
		
		Log.d(TAG,"initMediaPlayer");
		
		// 미디어 플레이어 생성
		if (mPlayer == null)
			mPlayer = new MediaPlayer();
		else{
			mPlayer.reset();
		}
		mPlayer.setOnCompletionListener(this);
		String fullFilePath = filePath;
		try
		{
			mPlayer.setDataSource(fullFilePath);
			mPlayer.prepare();   
			int point = mPlayer.getDuration();
			playSeekbar.setMax(point);

			int maxMinPoint = point / 1000 / 60;
			int maxSecPoint = (point / 1000) % 60;
			String maxMinPointStr = "";
			String maxSecPointStr = "";

			if (maxMinPoint < 10)
				maxMinPointStr = "0" + maxMinPoint + ":";
			else
				maxMinPointStr = maxMinPoint + ":";

			if (maxSecPoint < 10)
				maxSecPointStr = "0" + maxSecPoint;
			else
				maxSecPointStr = String.valueOf(maxSecPoint);

			mTvPlayMaxPoint.setText(maxMinPointStr + maxSecPointStr);		// 시간 값?

			playSeekbar.setProgress(0);	// init
		}
		catch(Exception e)
		{
			Log.d("ProgressRecorder", "media player Prepare Error : " + e);
		}
	}

	// 재생 시작
	private void startPlay()
	{
		Log.d("ProgressRecorder", "startPlay().....");
		try
		{
			mPlayer.start();

			// SeekBar의 상태를 mProgressCheckStepMs 마다 체크      
			mProgressHandler2.sendEmptyMessageDelayed(0, mProgressCheckStepMs);
		}
		catch (Exception e)
		{
			e.printStackTrace();
			Toast.makeText(this, "error : " + e.getMessage(), 0).show();
		}
	}

	@Override
	public void onCompletion(MediaPlayer mp)
	{
		// 재생이 끝났으므로 진행바를 가장 끝으로 위치시킨다
		playSeekbar.setProgress(mPlayer.getDuration());
		// 재생이 종료되면 즉시 SeekBar 메세지 핸들러를 호출한다. 
		mProgressHandler2.sendEmptyMessageDelayed(0, 0);
	}

	
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 서버 통신

	/**
	 * 음성 메시지를 다운받는다		selectFile . 예약 메시지니까 자신이 보낸 파일.
	 */
	public void threadDonwoloadAudioMessage() {

		// 프로그레스 바를 출력 한다.
		Log.d(TAG,"threadDonwoloadAudioMessage");
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				
				Log.d(TAG,"threadDonwoloadAudioMessage");
				
				SendMeFile sendMeFile = new SendMeFile();
				
				sendMeFile.setIdSendMeFile(receiveIdSendMeFile);					// 요청용 
				sendMeFile.setSendMeVoiceIdSendMeVoice(receiveIdSendMeVoice);		// 요청용
				sendMeFile.setSendMeVoiceSender(sender);					// 요청용		receiveReceiver -> sender : 나
				sendMeFile.setFileName(receiveFileName);				// 저장용

				SendMeAudioMessageRest sendMeAudioMessageRest = new SendMeAudioMessageRest();
				String result = sendMeAudioMessageRest.selectFile(sendMeFile);		
				filePath = result;
				
				if(result.length()>0){
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_INIT_PLAYING));	// 재생 준비
				}
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
			}
		});
		thread.start();
	}

	
	/**
	 * 서버에서 음성 메시지를 삭제한다
	 */
	public void threadDeleteAudioMessage() {

		
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				
				// 프로그레스 바를 출력 한다.
				Log.d(TAG,"threadDeleteAudioMessage");	
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
				
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeAudioMessageRest sendMeAudioMessageRest = new SendMeAudioMessageRest();
				
				SendMeVoice sendMeVoice = new SendMeVoice();
				sendMeVoice.setIdSendMeVoice(receiveIdSendMeVoice);
				sendMeVoice.setActivateYn("N");
				sendMeVoice.setModifyDate(nowTime);
				
				SendMeVoice result = sendMeAudioMessageRest.updateDeactivate(sendMeVoice);
					
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
				
				
				if(result.getResult().equals("SUCCESS")){		
					// "삭제 하였습니다."
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_DELETE_SUCCESS));				
					
					// 리스트 호출
					Intent intent = new Intent(returnThis(), SendMeReservationMessageListActivity.class);
					startActivity(intent);
					
					// 로컬에 저장된 거 지우고 나간다
					deleteFileAndFinishActivity();
				}else{
					// "삭제 실패했습니다."
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_DELETE_FAIL));
				}
				
				
			}
		});
		thread.start();
	}
	
	/**
	 * 예약 메시지를 전송한다
	 */
	public void threadUpdateDeliveryYn() {
		
		
		Thread thread = new Thread(new Runnable() {
			
			public void run() {
				
				
				// 프로그레스 바를 출력 한다.
				Log.d(TAG,"threadUpdateDeliveryYn");	
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
				
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeAudioMessageRest sendMeAudioMessageRest = new SendMeAudioMessageRest();
				
				SendMeVoice sendMeVoice = new SendMeVoice();
				sendMeVoice.setIdSendMeVoice(receiveIdSendMeVoice);
				sendMeVoice.setDeliveryYn("Y");
				sendMeVoice.setActivateYn("Y");
				sendMeVoice.setModifyDate(nowTime);
//				idSendMeVoice : 음성 메시지 아이디.	
//				deliveryYn : 발송 여부('Y')	
//				activateYn : 활성화 여부('Y')	
//				modifyDate : 수정 일자.	
				SendMeVoice result = sendMeAudioMessageRest.updateDeliveryYn(sendMeVoice);
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
				
				
				if(result.getResult().equals("SUCCESS")){	
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_SEND_SUCCESS));
					
					// 지우고 종료
					deleteFileAndFinishActivity();		
				}else{
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_SEND_FAIL));
				}
				
			}
		});
		thread.start();
	}
	
	/**
	 * 로그를 남긴다	 
	 */
	public void threadRegisterLog() {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeLog sendMeLog = new SendMeLog();
				sendMeLog.setPhoneNumber(sender);
				sendMeLog.setViewName(TAG);
				sendMeLog.setRegisterDate(nowTime);
				
				SendMeLogRest sendMeLogRest = new SendMeLogRest();
				
				sendMeLogRest.registerLog(sendMeLog);
			}
		});
		thread.start();
	}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void confirmNotification() {
		SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);

		sender = mSharedPreference.getString("phone_number", "");
		Log.i(TAG, "sender : " + sender);
	}

	
//	/**
//	 * sqlite 에 받은 메시지 정보를 저장한다. (보관함에 저장)
//	 *  저장 이후 액티비티를 종료한다. (파일은 지우지 않는다)
//	 */
//	public void saveReceiveMessageToDownload(){
//		
//		// 현시각
//		SendMeCommon sendMeCommon = new SendMeCommon();
//		String nowTime = sendMeCommon.getCurrentDate();
//		
//		SendMeVoice sendMeVoice = new SendMeVoice();
//		
//		// 메시지를 보낸 사람 정보
//		sendMeVoice.setSender(receiveSender);
//		sendMeVoice.setSenderName(receiveSenderName);
//
//		// 받는 사람 정보 (나)
//		sendMeVoice.setReceiver(sender);
//
//		// 현 시각
//		sendMeVoice.setRegisterDate(nowTime);
//		sendMeVoice.setModifyDate(nowTime);
//
//		// 파일 정보
//		sendMeVoice.setFileName(receiveFileName);
//		sendMeVoice.setFilePath(filePath);
//
//		// sqlite 에 저장
//		SendMeDBManagerAudioRecord sendMeDBManagerAudioRecord = new SendMeDBManagerAudioRecord(this);
//		if(sendMeDBManagerAudioRecord.insertDownloadAudioData(sendMeVoice)) {
//			
//			mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_SAVE_SUCCESS));		
//			
//			// 화면을 닫는다.
//			sendMeActivityManager.removeActivity(SendMeAudioPlayForReservationMessageActivity.this);
//			finish();
//			
//		} else {
//			mHandler.sendMessage(mHandler.obtainMessage(THREAD_TOAST_SAVE_FAIL));
//		}
//	}
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 액티비티 종료 관련 기능들

	
	// 컨텍스트 반환
	public Context returnThis() {
		return this;
	}
	
	/**
	 * 뒤로 가기 버튼을 정의 한다.
	 * 화면을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		Intent intent = new Intent(returnThis(), SendMeReservationMessageListActivity.class);
		startActivity(intent);
		
		// 화면을 닫는다.
		deleteFileAndFinishActivity();
	}

	/**
	 * 액티비티를 종료한다
	 *  디바이스의 뒤로가기 버튼으로 인한 종료 / 화면에서의 버튼 조작에 의한 액션 처리 이후 닫을때 호출된다
	 */
	public void deleteFileAndFinishActivity(){
		
		// 파일이 있다면 지운다.
		checkAndDeleteFile();
		
		// 종료
		mediaPlayerReleaseAndFinishThisActivity();
	}

	/**
	 * 종료. 미디어 플레이어 릴리즈
	 */
	public void mediaPlayerReleaseAndFinishThisActivity(){
		// 초기화
		if(mPlayer!=null){
			mPlayer.reset();
			//			mPlayer.release();	
			mPlayer = null;
		}
		// 화면을 닫는다.
		sendMeActivityManager.removeActivity(SendMeAudioPlayForReservationMessageActivity.this);
		finish();
	}
	
	/**
	 * 임시 파일이 있는지 체크하고 있다면 지운다.
	 */
	public void checkAndDeleteFile(){
		
		if(mPlayer!=null){
			mPlayer.reset();
			//			mPlayer.release();	
			mPlayer = null;
		}
		String fileChk = filePath;
		File file = new File(fileChk);
		if(file.exists()){
			file.delete();
			Log.d(TAG,"file delete success");
		}
	}
	
	@Override
	public void onResume(){
		super.onResume();
		dialog = ProgressDialog.show(SendMeAudioPlayForReservationMessageActivity.this, "", "Wait..", true);	// 제목, 내용
		dialog.hide();
	}
	@Override
	public void onStop(){
		super.onStop();
		dialog.dismiss();
	}
	
}
